[2016_hackover] [PWN] ping_gnop


Dynamic Analysis

$ ./ping_gnop
          _            ___ _  _  ___  ___
     _ __(_)_ _  __ _ / __| \| |/ _ \| _ \
    | '_ \ | ' \/ _` | (_ | .` | (_) |  _/
    | .__/_|_||_\__, |\___|_|\_|\___/|_|
    |_|         |___/     simulator 3.11

             o      .   _______ _______
              \_ 0     /______//______/|   @_o
                /\_,  /______//______/     /\
               | \    |      ||      |     / |

ping> 1
pong> 1

Static Analysis

먼저 IDA Hexray를 이용하여 해당 프로그램의 소스를 확인해보면 다음과 같습니다.

int play()
{
    char *v0; // eax@8
    char *v1; // eax@8
    int result; // eax@10
    char v3[512]; // [sp+Bh] [bp-23Dh]@1
    char v4; // [sp+20Bh] [bp-3Dh]@10
    char v5; // [sp+22Bh] [bp-1Dh]@8
    char *s; // [sp+22Ch] [bp-1Ch]@1
    int v7; // [sp+230h] [bp-18h]@1
    char *v8; // [sp+234h] [bp-14h]@7
    char *v9; // [sp+238h] [bp-10h]@7
    char *i; // [sp+23Ch] [bp-Ch]@1

    v7 = 322423550;
    printf("ping> ");
    _isoc99_scanf("%511s", v3);
    s = (char *)&unk_80BCEC8;
    for ( i = v3; *i; ++i )
    {
        if ( strchr(s, *i) )
        {
            puts("(겸뼞째)링 삘봺);
            exit(-1);
        }
    }
    v9 = v3;
    v8 = &v3[strlen(v3) - 1];
    while ( v9 < v8 )
    {
        v5 = *v9;
        v0 = v9++;
        *v0 = *v8;
        v1 = v8--;
        *v1 = v5;
    }
    printf("pong> %s\n\n");
    result = j_strcpy(&v4, v3);
    if ( v7 != 322423550 )
    {
        puts("(겸뼞째)링 삘봺);
        exit(-1);
    }
    return result;
}